/** 数组类型定义 */
let list1:number[] = [1,2,3,4,5];    //数字类型的数组
// console.log(list1);
let list2:Array<number> = [1,2,3,4,5];   //利用数组泛型声明数组
// console.log(list2);
let list3:Array<string> = ['Huang','bing'];
// console.log(list3);



/** 元组 */
let list4:[string,number];    //数量都是严格要求的
list4 = ['hardy',20];
// list4[4] = 'bing';
// console.log(list4);    //[ 'hardy', 20, <2 empty items>, 'bing' ]




/** 枚举 enum */
enum Color {
    Red=1,
    Green=2,
    Blue=3
}
let colorName: string = Color[2];
// console.log(colorName);





/** any 是一把双刃剑，跳过语法检查 */
let list5:any[] = [1,true,'hardy',function(){}];
// console.log(list5);




/** void  没有返回值的函数 */
function voidUser():void{
    console.log('no void function');
}



/** 联合类型 */
let num:number|null = 3;
num = null;





/** never 代表从来不会出现的值的类型*/
// 返回 never 的函数必须有无法被执行到的终止点
function error(message: string): never {
    throw new Error(message);
}
// 推断的返回值是 never
function fail() {
    return error("一些东西失败了");
}
// 返回 never 的函数必须有无法被执行到的终止点
function infiniteLoop(): never {
    while (true) {
    }
}








/** declare 关键字，声明 */
declare function create(o: object | null);
// create({name: 'hardy'});
// create(null);
// create(19);











/** 类型转化 */
let someValue = 'some string value';
let someValueLen1:number = (<string>someValue).length;
let someValueLen2:number = (someValue as string).length;
console.log(someValueLen1, someValueLen2);
















